package gestionBulletins.view;

import gestionBulletins.controller.InsertWindowActionListener;
import gestionBulletins.model.persistance.DaoFactory;
import gestionBulletins.model.persistance.DaoSection;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Observer;

import javax.swing.BoxLayout;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;

public class InsertWindow extends JFrame {
	
	protected InsertWindowActionListener eventsController;
	protected ArrayList<Observer> observers;
	protected DaoFactory daoFactory;
	public JButton boutonAjouter;
	public JButton boutonReset;
	public JButton boutonFermer;
	public JComboBox inputEtatCivil;
	public JTextField inputNom;
	public JTextField inputNomDEpouse;
	public JTextField inputPrenom1;
	public JTextField inputPrenom2;
	public JTextField inputPrenom3;
	public JTextField inputDateJour;
	public JTextField inputDateMois;
	public JTextField inputDateAnnee;
	public JTextField inputAdresse;
	public JTextField inputIle;
	public JTextField inputCommune;
	public JTextField inputTelDomicile;
	public JTextField inputTelBureau;
	public JTextField inputVini;
	public JTextField inputProfession;
	public JTextField inputReligion;
	public JComboBox inputSituationFamiliale;
	public JComboBox inputSections;
	public JTextField inputNomConjoint;
	public JTextField inputPrenomConjoint;
	public JTextField inputNbEnfants;
	public JCheckBox inputHasCard;
	public JTextField inputNumBureau;
	public JTextField inputNumElecteur;
	public JCheckBox inputHasVoted;
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public InsertWindow(DaoFactory daoFactory) {
		super();
		this.setDefaultCloseOperation(HIDE_ON_CLOSE);
		setTitle("Ajout d'un adhérent");
		this.daoFactory = daoFactory;
		observers = new ArrayList<Observer>();
		initComposantsGraphiques();
		bindToListener();
		setupFrame();
		setResizable(false);
		pack();
	}
	
	/**
	 * Initialisation des composants graphique composant la frame
	 */
	private void initComposantsGraphiques() {
		
		/* boutons du formulaire */
		boutonAjouter = new JButton("Insérer");
		boutonReset = new JButton("reset");
		boutonFermer = new JButton("Fermer");
		
		/* etat civil */
		String[] enumEtatCivil = { "Mr", "Mme", "Mlle" };
		inputEtatCivil = new JComboBox(enumEtatCivil);
		
		/* Nom */
		inputNom = new JTextField();
		
		/* Nom d'épouse */
		inputNomDEpouse = new JTextField();
		
		/* Prénoms */
		inputPrenom1 = new JTextField();
		inputPrenom2 = new JTextField();
		inputPrenom3 = new JTextField();
		
		/* Date de naissance */
		inputDateJour = new JTextField("jour");
		inputDateMois = new JTextField("mois");
		inputDateAnnee = new JTextField("année");
		
		/* Adresse */
		inputAdresse = new JTextField();
		
		/* Ile */
		inputIle = new JTextField();
		
		/* Commune */
		inputCommune = new JTextField();
		
		/* Téléphone domicile */
		inputTelDomicile = new JTextField();
		
		/* Téléphone bureau */
		inputTelBureau = new JTextField();
		
		/* Vini */
		inputVini = new JTextField();
		
		/* Profession */
		inputProfession = new JTextField();
		
		/* Religion */
		inputReligion = new JTextField();
		
		/* Situation Familiale */
		String[] enumSituFamille = { "Célibataire", "Marié(e)", "Concubinage", "Veuf(ve)" };
		inputSituationFamiliale = new JComboBox(enumSituFamille);
		
		/* membre de quelle section ? */
		DaoSection ds = daoFactory.getDaoSection();
		Collection<String> sections = ds.getAllPresident();
		String[] enumSections = new String[sections.size() + 1];
		int cpt = 0;
		enumSections[cpt++] = "dans aucune section";
		for (String president : sections) {
			//System.out.println("president de section: " + president);
			enumSections[cpt++] = president;
		}
		inputSections = new JComboBox(enumSections);
		
		/* Nom conjoint */
		inputNomConjoint = new JTextField();
		
		/* Prénom conjoint */
		inputPrenomConjoint = new JTextField();
		
		/* nombre d'enfants */
		inputNbEnfants = new JTextField();
		
		/* Possède une carte électorale ? */
		inputHasCard = new JCheckBox();
		
		/* Numéro de bureau */
		inputNumBureau = new JTextField();
		inputNumBureau.setEnabled(false);
		
		/* Numéro electeur */
		inputNumElecteur = new JTextField();
		inputNumElecteur.setEnabled(false);
		
		/* A voté ? */
		inputHasVoted = new JCheckBox();		
	}
	
	/**
	 * ajoute le listener à tout les composants graphiques qui ont en besoin
	 */
	private void bindToListener() {

		/* controleur d'évènements */
		eventsController = new InsertWindowActionListener(this);
		
		/* action listener */
		boutonAjouter.addActionListener(eventsController);
		boutonReset.addActionListener(eventsController);
		boutonFermer.addActionListener(eventsController);
		inputDateJour.addActionListener(eventsController);
		inputDateMois.addActionListener(eventsController);
		inputDateAnnee.addActionListener(eventsController);
		inputTelDomicile.addActionListener(eventsController);
		inputTelBureau.addActionListener(eventsController);
		inputVini.addActionListener(eventsController);
		inputSituationFamiliale.addActionListener(eventsController);
		inputSections.addActionListener(eventsController);
		inputHasCard.addActionListener(eventsController);
		inputHasVoted.addActionListener(eventsController);
		
		inputDateJour.addFocusListener(eventsController);
		inputDateMois.addFocusListener(eventsController);
		inputDateAnnee.addFocusListener(eventsController);
		
		
	}
	
	/**
	 * ajoute les composants dans les frames et les frames dans la frame principale
	 */
	private void setupFrame() {
		
		/* on recupere le contentPane de la JFrame */
		Container pane = getContentPane();
		
		/* layout manager principal */
		pane.setLayout(new BorderLayout());
		
		/* layout manager du formulaire */
		GridLayout layoutFormulaire = new GridLayout(0, 2);
		JPanel pf = new JPanel(layoutFormulaire);
		
		/* entête et bas de page */
		JPanel panelEntete = new JPanel();
		panelEntete.add(new JLabel("Insertion d'un bulletin d'adhésion"));
		pane.add(panelEntete, BorderLayout.NORTH);
		JPanel panelBasDePage = new JPanel();
		panelBasDePage.add(boutonAjouter);
		panelBasDePage.add(boutonReset);
		panelBasDePage.add(boutonFermer);
		pane.add(panelBasDePage, BorderLayout.SOUTH);
		
		/* marge de gauche et droite */
		pf.setBorder(new EmptyBorder(10, 10, 10, 10));		
		
		/* formulaire */
		pf.add(new JLabel("Etat civil: "));
		pf.add(inputEtatCivil);
		pf.add(new JLabel("Nom *: "));
		pf.add(inputNom);
		pf.add(new JLabel("Situation familiale: "));
		pf.add(inputSituationFamiliale);
		pf.add(new JLabel("Nom d'épouse: "));
		pf.add(inputNomDEpouse);
		pf.add(new JLabel("Prénom usuel *: "));
		pf.add(inputPrenom1);
		pf.add(new JLabel("Deuxième prénom: "));
		pf.add(inputPrenom2);
		pf.add(new JLabel("Troisième prénom: "));	
		pf.add(inputPrenom3);
		pf.add(new JLabel("Date de naissance *: "));
		JPanel datePanel = new JPanel();
		datePanel.setLayout(new BoxLayout(datePanel, BoxLayout.LINE_AXIS));
		datePanel.add(inputDateJour);
		datePanel.add(inputDateMois);
		datePanel.add(inputDateAnnee);
		pf.add(datePanel);
		pf.add(new JLabel("Ile *: "));
		pf.add(inputIle);
		pf.add(new JLabel("Commune *: "));
		pf.add(inputCommune);
		pf.add(new JLabel("Adresse *: "));
		pf.add(inputAdresse);
		pf.add(new JLabel("Section: "));
		pf.add(inputSections);
		pf.add(new JLabel("Tél domicile:"));
		pf.add(inputTelDomicile);
		pf.add(new JLabel("Tél bureau: "));
		pf.add(inputTelBureau);
		pf.add(new JLabel("Vini: "));
		pf.add(inputVini);
		pf.add(new JLabel("Profession: "));
		pf.add(inputProfession);
		pf.add(new JLabel("Religion: "));
		pf.add(inputReligion);
		pf.add(new JLabel("Nom du conjoint: "));
		pf.add(inputNomConjoint);
		pf.add(new JLabel("Prénom du conjoint: "));
		pf.add(inputPrenomConjoint);
		pf.add(new JLabel("Nombre d'enfants: "));
		pf.add(inputNbEnfants);
		pf.add(new JLabel("Possède une carte d'électeur ?"));
		pf.add(inputHasCard);
		pf.add(new JLabel("Numéro de carte d'électeur: "));
		pf.add(inputNumElecteur);
		pf.add(new JLabel("A voté ?"));
		pf.add(inputHasVoted);
		pf.add(new JLabel("Numéro de bureau: "));
		pf.add(inputNumBureau);
		
		pane.add(pf, BorderLayout.CENTER);
		
	}
	
	/**
	 * met à zero les champs du formulaire
	 */
	public void resetFormulaire() {
		inputEtatCivil.setSelectedIndex(0);
		
		/* Nom */
		inputNom.setText("");
		
		/* Nom d'épouse */
		inputNomDEpouse.setText("");
		
		/* Prénoms */
		inputPrenom1.setText("");
		inputPrenom2.setText("");
		inputPrenom3.setText("");
		
		/* Date de naissance */
		inputDateJour.setText("jour");
		inputDateMois.setText("mois");
		inputDateAnnee.setText("année");
		
		/* Adresse */
		inputAdresse.setText("");
		
		/* Ile */
		inputIle.setText("");
		
		/* Commune */
		inputCommune.setText("");
		
		/* Téléphone domicile */
		inputTelDomicile.setText("");
		
		/* Téléphone bureau */
		inputTelBureau.setText("");
		
		/* Vini */
		inputVini.setText("");
		
		/* Profession */
		inputProfession.setText("");
		
		/* Religion */
		inputReligion.setText("");
		
		/* Situation Familiale */
		inputSituationFamiliale.setSelectedIndex(0);
		
		/* Sections */
		DaoSection ds = daoFactory.getDaoSection();
		Collection<String> sections = ds.getAllPresident();
		String[] enumSections = new String[sections.size() + 1];
		int cpt = 0;
		enumSections[cpt++] = "dans aucune section";
		for (String president : sections) {
			//System.out.println("president de section: " + president);
			enumSections[cpt++] = president;
		}
		for (String string : enumSections) {
			//System.out.println("debug:" + string);
		}
		inputSections.setModel(new DefaultComboBoxModel(enumSections));
		inputSections.setSelectedIndex(0);
		
		/* Nom conjoint */
		inputNomConjoint.setText("");
		
		/* Prénom conjoint */
		inputPrenomConjoint.setText("");
		
		/* nombre d'enfants */
		inputNbEnfants.setText("");
		
		/* Possède une carte électorale ? */
		inputHasCard.setSelected(false);
		
		/* Numéro electeur */
		inputNumElecteur.setText("");
		inputNumElecteur.setEnabled(false);
		
		/* A voté ? */
		inputHasVoted.setSelected(false);
		
		/* Numéro de bureau */
		inputNumBureau.setText("");
		inputNumBureau.setEnabled(false);
	}
	
	public DaoFactory getDaoFactory() {
		return daoFactory;
	}
	
	public void addObserver(Observer o) {
		observers.add(o);
	}
	
	public void notifyObservers() {
		//System.out.println("j'informe mes observateurs...(y'en a " + observers.size() + ")");
		for (Observer o : observers) {
			o.update(null, null);
		}
	}
	
	/* pour test séparé */
	public static void main(String[] args) {
		InsertWindow window = new InsertWindow(null);
		window.pack();
		window.setVisible(true);
	}

}
